﻿#pragma once
#include <boost/intrusive_ptr.hpp>
#include "Datatypes.h"
#include "DLL.h"

namespace DarkStorm2D 
{
//! Klasa licznika referencji potrzebna do inteligentnego wskaźnika.
/*! 
 * Od tej klasy powinna dziedziczyć klasa która chce korzystać z mechanizmu SmartPointer'a.
 */
class DLLDARKSTORM2D CRefCounter 
{
	//! Licznik referencji.
	uint m_References;

public:
	//! Konstruktor zeruje licznik.
	CRefCounter() : m_References(0) {}
	virtual ~CRefCounter() {}

	//! Dodaje referencje do wskaźnika
	void AddRef()
	{
		++m_References;
	}
	//! Odejmuje referencje od wskaźnika
	int Release()
	{
		--m_References;
		return m_References;
	}
};

template <typename T> void intrusive_ptr_add_ref(T * p)
	{
		p->AddRef();
	}

template <typename T> void intrusive_ptr_release(T * p)
	{
		if (p->Release() <= 0)
			delete p;
	}
};
